آموزش c
English -فارسي

Thursday July 07, 2005 09:49:03 ق.ظ

 

 

 

 

 

صفحه اول

 

 

مقدمات زبانc      
زبان C در سال 1970 توسط دنيس ريچي طراحي گرديد. اين زبان تكامل يافته زبان BCPL ميباشد كه طراح آن مارتين ريچاردز است ،و زبان BCP از زبان B كه طراح آن كن تامپسون مي باشد ، نتيجه شده است .
زبان C معمولا" يك زبان مياني ناميده مي شود . اين بدان معني نيست كه آموزش اين زبان مشكل است ، يا قدرت آن از زبان هاي برنامه سازي مثل پاسكال و بيسيك كمتر است و يا اين كه مشكلاتي مشابه زبان اسمبلي براي برنامه نويس ايجاد مي كند.
علت مياني بودن زبان C اين است كه عناصر زبان هاي سطح بالا را با خصيصه تابعي
زبان اسمبلي درهم آميخته است
زبان C همانند ساير زبانهاي مياني با مفاهيم بيت ، بايت و آدرس كه از عناصر ابتدايي ماشين هستند سر و كار دارد . يعني در اين زبان مي توان محتويات بيت ها و بايت ها را تيز تغيير داد .
برنامه هاي نوشته شده به زبان C براحتي از ماشيني به ماشين ديگر قابل انتقال مي باشند . مثلا" برنامه نوشته شده براي كامپيوتر APPL در كامپيوترهاي IBM قابل اجرا است . اين خصيصه را قابل حمل بودن (Portability) زبان مي گويند . كليه زبان هاي برنامه سازي سطح بالا و مياني داراي نوعهاي داده (data types) هستند . هر نوع داده ، مجموعه اي از مقادير را مشخص مي كند كه اعمال خاصي روي
آنها قابل انجام است . نوع داده اي كه در اكثر زبانها وجود دارد عبارتند از : اعداد صحيح ، كاراكتري و اعداد اعشاري . C داراي 5 نوع داده اصلي است كه در آن تقريبا" تبديل هر نوع داده به نوع ديگر امكان پذير است . مثلا" در يك عبارت مي توان نوع كاراكتري را با نوع عددي صحيح و يا اعشاري تركيب كرد . زبان C خطاي زمان اجرا مثل boundray checking را چك نمي كند . منظور از boundray checkingاين است كه در آرايه ها تجاوز از حدود مشخص شده ، به راحتي امكان پذير بوده و از نظر كامپايلر با خطايي مواجه نميشود. اين مساله برميگردد به اين كه در زبان C آرايهيك اشاره گر (pointer) است . در اين راستا ، نوع پارامترها و آرگومان هاي توابع نيز در گونه هاي قديمي C با يكديگر مطابقت نشده و از نظر كامپايلر با خطا مواجه نمي شد ولي در گونه هاي جديد C با معرفي الگوي تابع (Function prototype) اين مشكل رفع شده است . Cهمانند زبان هاي ALGOL، PASCAl، و... يك زبان ساخت يافته است . يك زبان برنامه سازي ساخت يافته امكانات زيادي ، از جمله استفاده از چند ساختار حلقه سازي مثل while، do-while،و forو را فراهم مي كند . در اين گونه زبان ها از goto به ندرت استفاده مي شود و نوشتن دستورات برنامه در هر ستوني از خط و در هر جاي فايل امكان پذير بوده ، مثل زبان فرترن مقيد به ستون هاي خاصي نيستند. استفاده از زيربرنامه ها و بلاك ها نيز از خصيصه هاي اين نوع زبان ها هستند . ذكر اسامي چند زبان ساخت يافته و غير ساخت يافته ، در انتخاب زبان برنامه سازي جهت برنامه نويسي مفيد است . بعضي از زبانهاي ساخت يافته و غيرساخت يافته
هر برنامه در زبان C داراي خصيصه هايي است كه بعضي از آنها عبارتند از :

 1در زبان C هر دستور برنامه به يك ; ختم مي شود .

2هر دستور ميتواند درچند خط ادامه داشته و يك خط ممكن است شامل چند دستور
باشد .

 3حداكثر طول يك خط برنامه 254 كاراكتر است .

 4در زبان C برنامه نويس مي تواند در هر نقطه از برنامه ، بااستفاده از علائم {و }و يك بلاك را مشخص كرده و هر متغيري را كه مي خواهد در آنجا تعريف نمايد .
اين متغيرها فقط در آن بلاك معني خواهند داشت . توجه داريم كه هر بلاك مجموعه اي از دستورات وابسته به يكديگر خواهد بود :
ؤؤ { |

بلاك | ; مجموعه دستورات } |
ؤؤ 5
براي داشتن توضيحات در برنامه كافي است آنها را دربين /*و *و/ قرار داد: *

توضيحات /* C
يك زبان ساخت يافته بلاكي نيست . اين بدان معني است كه تعريف يك زيربرنامه ( در اينجا تابع ) در زيربرنامه ديگر ( همانند پاسكال ) امكان پذير نيست و اين امر از مساله coupling مي كاهد . Cزبان برنامه نويسي سيستم است . منظور از برنامه هاي سيستم عبارتند از : 1
سيستم عامل (Operating system) 2
مفسر (Interpreter) 3
ويراستار (Editor) 4
اسمبلر (Assrmbler) 5
كامپايلر (Compiler) 6
مديريت بانكهاي اطلاعاتي (Database management) امروزه C در اكثر امور برنامه نويسي مورد استفاده قرار مي گيرد . زيرا اين زبان هم داراي خصيصه " قابل حمل بودن " است و هم داراي كارآيي خوبي مي باشد و سرعت زياد C بر محبوبيت آن افزوده است . مساله قابل حمل بودن ، يك مساله بسيار مهم است زيرا هم موجب صرفه جويي در وقت شده و هم باعث صرفه جويي در هزينه ها مي گردد . زبان C فقط داراي 32 كلمه كليدي است ( جدول (3) ) كه 27 كلمه كليدي آن توسط ريچي ( طراح زبان ) معرفي شده و 5 كلمه كليدي ديگر توسط موسسه استاندارد سازي زبان به آن اضافه شده است . اين تعداد در مقايسه با 159 كلمه كليدي كه در زبان بيسيك وجود دارد قابل توجه است .
انواع داده
همان طور كه قبلا" گفته شد در هر زبان برنامه سازي تعدادي از نوع هاي داده وجود دارند كه بازه اي را شامل بوده و اعمال خاصي روي آنها انجام پذير است و در Cپنج نوع داده اصلي وجود دارد كه عبارتند از : char، int،، float،، double، و void. در اين زبان اندازه و محدوده اي كه هر نوع داده اختيار مي كند بستگي به نوع پردازشگر (Processor) و نحوه پياده سازي كامپايلر دارد. شناسه هايي ( متغير برچسب ، اسامي توابع و ... ) كه ازنوع char باشند براي ذخيره كردن مقاديري كه توسط كاراكترهاي اسكي تعريف شده اند به كار مي روند. شناسه هايي از نوع int براي ذخيره كردن مقادير صحيح ، و از نوع floatو doubleو براي ذخيره كردن اطلاعات عددي اعشاري به كار ميروند كه محدوده آنها توسط تعداد ارقام و دقت آنها مشخص ميشود.
نوع void در مورد توباع به كار مي رود .

تعريف نوع متغير
براي استفاده از متغيرها درC بايد ابتدا آنها را تعريف كنيم . تعريف متغيرها
شامل نامگذاري و تعيين نوع آنها است كه به صورت زير انجام مي شود
<نوع> <اسامي متغيرها>
يكي از انواع است كه قبلا<نوع>" شامل متغيرهايي <اسامي متغيرها> ذكر كرديم و
است كه مي خواهيم داراي آن نوع باشند . براي تعريف چند متغير در يك دستور بايد
اسامي با كاما از يكديگر جدا گردد : int var1/ var2

دستور فوق دو متغير به اسامي var2و var1و را از نوع int تعريف مي كند . float flovar1/ flovar2;

دستور فوق ، دو متغير به نام هاي flovar2و flovar1و را از نوع float تعريف
مي كند . double d1;
char ch;

اولين دستور ، d1 را از نوع double و دستور دوم متغير ch را از نوع char
تعريف مي كند .

مقدار دادن به متغيرها
براي مقدار دادن به متغيرها مي توان به دو طريق عمل كرد: 1 به هنگام تعريف
متغير . 2 پس از تعريف متغير . به عنوان مثال : int a=0;
int b/ c/ d/ e=0;
char ch= 'a';
 

تابع ()printf

اين تابع براي انتقال اطلاعات از كامپيوتر به صفحه نمايش مورد استفاده قرار
مي گيرد و بصورت زير استفاده مي شود : ;
( عبارت ديگر " / عبارت " 1) printf) "
عبارت " 1 شامل تعدادي كاراكترهاي كنترلي ، كاراكترهاي قالب جهت تعيين شكل
خروجي و رشته هاي ديگري است كه بايد به خروجي منتقل شوند . " عبارت ديگر " شامل
اطلاعاتي هستند كه با فرمت مشخص شده در " عبارت " 1، بايد به خروجي منتقل شوند.
كاراكترهايي كه براي تعيين فرمت خروجي مورد استفاده قرار مي گيرند با كاراكتر %
شروع مي شوند ( جدول 1 ) .

كاراكتر | نوع اطلاعات كه بايد به خروجي منتقل شود |
%C | % يك كاراكتر | |
%d | % اعداد صحيح دهدهي مثبت و منفي | |
%i | % اعداد صحيح دهدهي مثبت و منفي | |
%e | % نمايش علمي عدد همراه با حرف e | |
%E | % نمايش علمي عدد همراه با حرف E | |
%f | % عدد اعشاري مميز شناور | |
%g | % اعداد اعشاري مميز شناور | |
%G | % اعداد اعشاري مميز شناور | |
%O | % اعداد مبناي 8 مثبت | |
%S | % رشته اي از كاراكترها ( عبارت رشته اي ) | |
%U | % اعداد صحيح بدون علامت ( مثبت ) | |
%x | % اعداد مبناي 16 مثبت با حروف كوچك | |
%X | % اعداد مبناي 16 مثبت با حروف بزرگ | |
%p pointer | % ( اشاره گر ) | |
%n | % موجب ميشود تا تعداد كاراكترهايي كه تا قبل | |
| ازاين كاراكتر به خروجي منتقل شده اند شمارش | |
| شده و در پارامتر متناظر با آن قرار گيرد . | |
%% | % علامت % |

جدول (1) . كاراكترهاي فرمت در تابع ()printf

كاراكترهاي كنترلي كه در تابع ()printf بكار ميروند در جدول (2) آمده است .
بعضي از كاراكترهاي كنترلي براي انتقال خروجي به يك محل معين از صفحه نمايش
مورد استفاده قرار مي گيرند .

| كاراكتر عملي كه انجام مي شود |

\f | \ موجب انتقال كنترل به صفحه جديد مي شود | |
\n | \ موجب انتقال كنترل به خط جديد مي شود | |
\t | \ انتقال به 8 محل بعدي صفحه نمايش | |
\" | \ چاپ كوتيشن (") | |
\' | \ چاپ كوتيشن (') | |
\0 NULL | \ رشته تهي | | back slash | \\ |
|
\V | \ انتقال كنترل به 8 سطر بعدي | |
\N | \ ثابت هاي مبناي 8( N( عدد مبناي 8 است ) | |
\xN | \ ثابت هاي مبناي 16( N( عدد مبناي 16 است ) |

جدول (2) . كاراكترهاي كنترلي
چند دستور متوالي كه شامل تابع ()print باشند ، خروجي خود را بر روي يك سطر
منتقل يم كنند . مگر اين كه با پارامتر كنترلي \n كنترل را به سطر بعدي منتقل
كنيم .
مثال 1:

                                                                     main)(

        {

          printf(" i like %c "/'c' );

          printf("%s"/"very much." );

        }


خروجي حاصل از اجراي برنامه فوق بصورت ذيل خواهد بود : i like c very much.

با استفاده از \n مي توانيم خروجي را در چند سطر داشته باشيم . main)(
{
printf("this is second program.\n" );
printf("output is in two line." );
}

خروجي حاصل از اجراي برنامه فوق بصورت ذيل است : this is second program.
output is in two line.


مثال 2: main)(
{
int num ;
printf("the address of num is:" );
printf(" %p"/ &num );
}

در مثال فوق عبارت &num آدرس متغير num را مشخص مي كند كه براي نوشتن آن از
كاراكتر فرمت %p استفاده شده است . نمونه اي از خروجي مثال 2 بصورت زير است . the address of num is : 6A30:OFE4

اگر در تابع ()printf چند كاراكتر فرمت داشته باشيم ، هر كاراكتر با يك عنصر
داده كه بايد به خروجي برود تطبيق داده مي شود : main)(
{
int a=10 ;
float b=20 ;
printf(" a is:%d/b is :%f"/a/b);
}

خروجي حاصل از اجراي برنامه فوق بصورت ذيل است : a is:10/b is:20:000000


مثال 3: main)(
{
unsigned int num ;
num=100 ;
printf("the value of num is:%u"/num);
}

همانطوري كه در مثال 3 مشاهده مي شود ، براي چاپ عدد num كه بصورت عدد صحيح
بدون علامت تعريف شد ، از %u استفاده شده است .
خروجي حاصل از اجراي برنامه مثال 3 به صورت ذيل است : the value of num is:100


مثال 4: main)(
{
double d ;
d=le+007 ;
printf("the value of d is:%e\n"/d);
printf("the value of d is:%E\n"/d);
printf("the value of d is:%g\n"/d);
}

خروجي حاصل از اجراي برنامه مثال 4 بصورت ذيل خواهد بود : the value of d is:1.00000e+07
the value of d is:1.00000E+07
the value of d is:1e+07

همانطور كه مشاهده مي شود براي چاپ اعدادي كه بصورت نماد علمي باشند ميتوان
از كاراكترهاي فرمت % e، % E،و % gو استفاده كرد .

مثال 5: main)(
{
float f=12.50 ;
int t=10 ;
printf("\n f is:%f"/f );
printf(" tenper is:%%%d"/t );
}

خروجي حاصل از اجراي برنامه فوق بصورت زير است : f is:12.500000/tenper is:%10

در مثال 5 براي چاپ علامت % از كاراكتر %% و براي چاپ متغير f از نوع float
مي باشد از %f استفاده شده است .
كاراكتر فرمت %n از ساير كاراكترهاي فرمت متفاوت است . اين كاراكتر بجاي
انتقال مقاديري به خروجي ، موجب مي شود تا تعداد كاركترهايي كه تا قبل از اين
كاراكتر به خروجي منتقل شده اند ، شمارش شده و در پارامتر متناظر با آن قرار
بگيرد .

مثال 6: main)(
{
printf("\neach\tword\tis\n" );
printf("tabbed\tover\tonce" );
}

خروجي از اجراي برنامه فوق بصورت زير خواهد بود : each word is
tabbed over once

كاراكتر كنترلي \b موجب انتقال مكان نما به اندازه يك كاراكتر به عقب ميشود
( بسمت چپ ). كاراكترهاي كنترلي \ "و \و براي چاپ كوتيشن درخروجي مورد استفاده
قرار مي گيرند .

تعيين طول ميدان در تابع ()printf
در حين انتقال اطلاعات توسط تابع ()printf ميتوانيم طول ميدان خروجي را مشخص
كنيم . در اين مورد مي توانيم محل نقطه اعشار و تعداد ارقام اعشار را نيز تعيين
كنيم . تعيين طول ميدان در جدول بندي ها بسيار مفيد است . طول ميدان ، بصورت w.d
است كه در اعداد اعشاري مميز شناور ، w طول ميدان و d تعداد ارقام اعشار را
مشخص مي كند .

مثال 7: main)(
{
printf("\n%8.1f %8.1f %8.1f\n"
/3.0/12.5/523.3 );
printf("\n%8.1f %8.1f %8.1f\n"
/300.0/1200.5/5300.3 );
}

خروجي حاصل از اجراي برنامه فوق بصورت زير است : 3.0 12.5 523.3
300.0 1200.5 5300.3

همانطوركه مشاهده مي گردد طول ميدان برابر با 8 و تعداد ارقام اعشار، برابر
با يك كه در منتهااليه سمت راست ميدان قرار گرفته ، منظور شده است . براي توضيح
بيشتر ، عدد 5300/3 را در حافظه نشان مي دهيم :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | 5 | 3 | 0 | 0 | . | 3 |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
اگر فرمت w.d كه طول ميدان را مشخص مي كند در مورد رشته ها استفاده گردد ، w
حداقل طول ميدان و d حداكثر كاراكترهاي قابل چاپ را مشخص مي كند .
اگر w.d در مورد اعداد صحيح بكار برده شود ، w مشخص كننده حداقل طول ميدان
و d تعيين كننده حداكثر طول ميدان است .

مثال 8: main)(
{
printf("%7.4f\n"/123.1234567 );
printf("%3.8d\n"/1000 );
printf("%10.16a\n"/"this is a" );
printf(" simple test" );
}

خروجي حاصل از اجراي برنامه فوق بصورت زير است : 123.1235
00001000
this is a simple

 

 
 

 شمارنده
Copyright © 2005 ifjam inc.All right reserved
Email to: ifjam@hotmail.com